export const metadata = {
  sidebar_position: 4,
  title: "🟡 Код как рассуждение",
};

# 🟡 Код как рассуждение

[Program-aided Language Models (PAL)](https://reasonwithpal.com)(@gao2022pal) - еще один пример системы MRKL.
Когда им задают вопрос, PAL способны **написать код**, который решает этот вопрос. Они посылают код в программную среду выполнения, чтобы получить результат. PAL работает в отличие от CoT; промежуточные рассуждения PAL - это код, а CoT - естественный язык.

<div style={{ textAlign: "center" }}>
  <Image
    src="/docs/assets/advanced/pal.webp"
    width={1380}
    height={1240}
    style={{ width: "500px", margin: "auto" }}
  />
</div>

<div style={{ textAlign: "center" }}>Пример PAL (Gao и др.)</div>

Важно отметить, что PAL фактически чередует естественный язык (NL - natural language) и код.
На изображении выше синим цветом выделены рассуждения на естественном языке, которые генерирует PAL. Хотя это не показано на изображении, PAL фактически генерирует '\#' перед каждой строкой рассуждений на естественном языке, так что они интерпретируются как комментарии программной средой выполнения.

## Пример

Давайте рассмотрим пример решения PAL математического вопроса. Я использую промт из трех вопросов, который является упрощенной версией [вот этого](https://github.com/reasoning-machines/pal/blob/main/pal/prompt/math_prompts.py)(@gao2022pal).

Для этого я буду использовать langchain, пакет Python для объединения функциональности LLM в цепочку. Сначала необходимо выполнить несколько установок:

```python
!pip install langchain==0.0.26
!pip install openai
from langchain.llms import OpenAI
import os
os.environ["OPENAI_API_KEY"] = "sk-YOUR_KEY_HERE"
```

Затем мы можем создать копию GPT-3 davinci-002 (при использовании этого объекта происходит вызов API)

```
llm = OpenAI(model_name='text-davinci-002', temperature=0)
```

Вот несколько примеров промта:

```python
MATH_PROMPT = '''
Q: В серверной комнате было девять компьютеров. Каждый день, с понедельника по четверг, устанавливалось еще пять компьютеров. Сколько компьютеров сейчас находится в серверной?

# решение на языке Python:
"""В серверной комнате было девять компьютеров. Каждый день с понедельника по четверг устанавливалось еще пять компьютеров. Сколько компьютеров сейчас в серверной?"""
компьютеры_начальные = 9
компьютеры_в_день = 5
число_дней = 4 # 4 дня между понедельником и четвергом
компьютеры_добавлены = компьютеры_в_день * число_дней
компьютеры_всего = компьютеры_начальные + компьютеры_добавленные
результат = компьютеры_всего
вернуть результат


Q: У Шона есть пять игрушек. На Рождество он получил по две игрушки от мамы и папы. Сколько игрушек у него сейчас?

# решение на языке Python:
"""У Шона есть пять игрушек. На Рождество он получил по две игрушки от мамы и папы. Сколько игрушек у него сейчас?"""
игрушки_инициалы = 5
игрушки_мамы = 2
папины_игрушки = 2
общее_полученное = мама_игрушки + папа_игрушки
общее_количество_игрушек = игрушки_начальные + общее_количество_полученных
результат = всего_игрушек


Q: У Джейсона было 20 леденцов. Он дал Денни несколько леденцов. Теперь у Джейсона 12 леденцов. Сколько леденцов Джейсон отдал Денни?

# решение на языке Python:
"""У Джейсона было 20 леденцов. Он дал Денни несколько леденцов. Теперь у Джейсона 12 леденцов. Сколько леденцов Джейсон отдал Денни?""""
джейсон_леденцы_начало = 20
джейсон_леденцы_после = 12 денни_леденцы = джейсон_леденцы_начало - джейсон_леденцы_после
результат = денни_леденцы

Q вопрос: {question}

# решение на языке Python:
'''
```

Теперь мы можем передать комбинированный промт в GPT-3.

```
llm_out = llm(MATH_PROMPT.format(question=question))
print(llm_out)
```

Вывод:

<pre>
  <span className="bluegreen-highlight">
    """Эмма совершила 60-минутный перелет на самолете в Сиэтл. Затем она
    проехала 2 часа на поезде до Портленда, а затем 30 минут на автобусе до
    Ванкувера. Сколько времени ей понадобилось, чтобы добраться до Ванкувера?"""
    <br />
    полёт_на_самолёте = 60
    <br />
    проезд_на_поезде = 2 * 60 # 2 часа в минутах
    <br />
    проезд_на_автобусе = 30
    <br />
    общее_время = полёт_на_самолёте + проезд_на_поезде + проезд_на_автобусе
    <br />
    результат = общее_время
  </span>
</pre>

Наконец, мы можем передать этот код в среду выполнения Python, чтобы получить ответ:

```python
exec(llm_out)
print(result)
```

На выходе получается **210**, что верно.

Смотрите блокнот Jupyter для этого примера [здесь] (https://github.com/trigaten/Learn_Prompting/tree/main/docs/code_examples/PAL.ipynb).

## Подробнее

Также смотрите пример [PAL's colab](https://colab.research.google.com/drive/1u4_RsdI0E79PCMDdcPiJUzYhdnjoXeXc?usp=sharing#scrollTo=Ba0ycacK4i1V).
